✅空リンクも取得出来るようにする | external-completion
実装
非同期処理
各projectの取得は await
で同期処理にする
各projectのfetchを並列に走らせて、それらの Promise
を Promise.all
でまとめる
2020-09-03 08:16:19 意外と簡単にできた
2020-09-05 22:01:27 どこからもリンクされていないページのタイトルが補完候補に挙がってこないことに気づいた
links
だけでなく、 title
もリストに加えるように修正する
script.js async _importLinks() {
return this.projects.map(project =>
this._fetchAllLinks(project)
.then(links => {
links.forEach(link => this.links.push(`/${project}/${link}`));
return links.length;
})
.then(length => console.log(`Loaded ${length} links from /${project}`))
);
}
async _fetchAllLinks(projectName) {
let followingId = null;
let result =[];
console.log(`Start loading links from ${projectName}...`);
while (true) {
await (!followingId ?
fetch(`/api/pages/${projectName}/search/titles`) :
fetch(`/api/pages/${projectName}/search/titles?followingId=${followingId}`))
.then(res => {
followingId = res.headers.get('X-Following-Id');
return res.json();
})
.then(json => json.map(page => [...page.links, page.title])
.reduce((links, cur) => [...links, ...cur]))
.then(links => result = [...result, ...links]);
if(!followingId) break;
console.log(`Loading links from ${projectName}: followingId = ${followingId}`);
}
console.log(`Finish loading links from ${projectName}.`);
//重複を取り除く
return [...new Set(result)];
}